package com.hpl.singletonmode.singleton;

/**
 * 枚举
 * <p>
 * 最安全且简单的方式，防止反序列化和反射攻击。
 * 枚举类的实例创建由 JVM 保证线程安全。每个枚举类型在类加载时会被初始化，而类加载过程是线程安全的，因此不存在并发问题。
 * 每个枚举值在 Java 程序的生命周期内只会被初始化一次。INSTANCE 是一个常量，JVM 保证其唯一性。
 * 枚举的构造方法默认是 private，并且在反射调用时会直接抛出 java.lang.IllegalArgumentException，禁止通过反射创建新的实例。
 * 普通单例类即使是 private 构造方法，也可能通过序列化和反序列化重新生成对象。枚举类型的序列化机制是由 JVM 内部控制的。即使进行序列化和反序列化，返回的始终是同一个枚举实例。
 * 缺点：枚举类型在类加载时即初始化，不能按需加载实例。如果需要延迟加载，可以考虑其他实现方式（如静态内部类）
 * </p>
 * @author hpl
 * @since 2024/12/12
 */
public enum SingletonEnum {

    INSTANCE;

    public void doSomething() {
        System.out.println("Singleton using Enum.");
    }
}
